import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
import os  # 用于处理文件路径
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm

# 设置字体，比如使用系统中存在的黑体
myfont = fm.FontProperties(fname='C:/Windows/Fonts/simhei.ttf')  # 黑体字体路径，根据系统调整
plt.rcParams['font.family'] = myfont.get_name()

# 设置图片所在目录（请替换为你的图片实际存储路径）

image_dir = r"C:\Users\29909\Pictures"

# 拼接完整文件路径（确保此处文件名与实际图片文件名一致，比如 face.png 或 修狗.jpg ，根据实际情况改）
# 假设实际图片是 face.png ，如果是修狗.jpg 就改成 "修狗.jpg"
image_filename = "修狗.jpg"
image_path = os.path.join(image_dir, image_filename)

# 尝试打开图片
try:
    face = Image.open(image_path)
    im = np.array(face)  # 转换为 numpy 数组
except FileNotFoundError:
    print(f"错误：找不到文件 {image_path}")
    print("请检查路径、文件名是否正确，或文件是否存在")
    exit()  # 若文件不存在则退出程序

# 打印数组信息
print(f"数组类型: {type(im)}")       # 输出数组类型，应为 numpy.ndarray
print(f"数据类型: {im.dtype}")       # 输出数据类型，通常是 uint8
print(f"图片尺寸(高, 宽, 通道): {im.shape}")  # 输出图片尺寸

# 提取红色通道（仅保留红色，绿、蓝通道置 0 ）
im_red = im.copy()  # 复制原数组，避免修改原图
im_red[:, :, 1] = 0  # 绿色通道置 0
im_red[:, :, 2] = 0  # 蓝色通道置 0

# 显示原图和处理后的图
plt.figure(figsize=(10, 5))  # 设置画布大小，方便对比

# 显示原图
plt.subplot(1, 2, 1)  # 1 行 2 列，第 1 个子图
plt.imshow(im)
plt.title("原图")
plt.axis("off")  # 隐藏坐标轴

# 显示红色通道图
plt.subplot(1, 2, 2)  # 1 行 2 列，第 2 个子图
plt.imshow(im_red)
plt.title("红色通道图")
plt.axis("off")  # 隐藏坐标轴

plt.tight_layout()  # 自动调整布局，避免标签重叠
plt.show()

# 保存处理后的红色通道图片到当前运行目录。
save_filename = "numpy_red.png"
Image.fromarray(im_red).save(save_filename)
print(f"红色通道图片已保存为: {save_filename}")


            #灰度图片

# 设置中文字体，避免显示乱码
plt.rcParams["font.family"] = ["SimHei"]

# 图片路径（根据实际情况修改）
image_dir = r"C:\Users\29909\Pictures"
image_path = r"C:\Users\29909\Pictures\修狗.jpg"

# 检查文件是否存在
if not os.path.exists(image_path):
    print(f"错误：找不到文件 {image_path}")
    exit()

# 读取图片并转换为数组
face = Image.open(image_path)
im = np.array(face)  # 彩色图数组（ shape 为 (高, 宽, 3)）

# 转换为灰度图（'L'模式表示8位灰度图）
im_gray = np.array(face.convert('L'))  # 灰度图数组（ shape 为 (高, 宽)）

# 打印灰度图数组信息
print(type(im_gray))    # <class 'numpy.ndarray'>
print(im_gray.dtype)    # uint8
print(im_gray.shape)    # (768, 1024) （示例尺寸）

# 展示灰度图（使用gray colormap更符合人眼对灰度的感知）
plt.figure()
plt.imshow(im_gray, cmap='gray')  # 不加cmap可能显示为伪彩色
plt.title('灰度图')
plt.axis('off')  # 隐藏坐标轴
plt.show()


     #通过（x,y）可以取得或者修改对应像素点的值
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
import os

#修改字体
plt.rcParams["font.family"] = ["SimHei"]
# 图片路径（替换为实际路径）
image_path = r"C:\Users\29909\Pictures\修狗.jpg"
if not os.path.exists(image_path):
    print(f"错误：文件不存在 - {image_path}")
else:
    # 打开图片并转为 numpy 数组
    face = Image.open(image_path)
    im = np.array(face)

    # 查看并打印原始像素信息
    pixel_value = im[200, 300]
    print(f"原始像素(200, 300)值：{pixel_value}")
    print(f"像素值类型：{type(pixel_value)}")

    # 修改像素值为红色 (RGB: 255, 0, 0)
    im[200, 300] = [255, 0, 0]
    print(f"修改后像素(200, 300)值：{im[200, 300]}")

    # 展示修改后的图片
    plt.figure()
    plt.imshow(im)
    plt.title("修改像素后的图片")
    plt.axis('off')  # 隐藏坐标轴
    plt.show()


    #通过unpacking获得R、G、B三通道的值，并修改

#修改字体
plt.rcParams["font.family"] = ["SimHei"]

# 1. 打开图片（替换为你的实际路径）
image_path = r"C:\Users\29909\Pictures\修狗.jpg"
face = Image.open(image_path)
im = np.array(face)

# 2. 读取并解包像素RGB值（正确坐标，修正θ为0）
R, G, B = im[200, 300]  # 取(200,300)位置的像素
print(f"R通道值: {R}, G通道值: {G}, B通道值: {B}")

# 3. 修改像素值（三种方式演示）
# 方式1：直接赋值元组（设为黑色）
im[200, 300] = (0, 0, 0)

# 方式2：单独修改R通道（设为0）
im[100, 150, 0] = 0

# 方式3：单独修改G、B通道（设为8）
im[100, 150, 1] = 8
im[100, 150, 2] = 8

# 4. 展示修改后的图片
plt.imshow(im)
plt.title("修改像素后的图片")
plt.axis('off')  # 隐藏坐标轴
plt.show()

# 5. 保存修改（可选）
modified_face = Image.fromarray(im)
modified_face.save("modified_face.png")


             #减色算法的实现

def color_quantization(image, num_levels):
    # 计算每个等级的间隔
    step = 256 // num_levels
    # 减色处理：将每个像素值映射到最近的等级
    quantized = (image // step) * step
    return quantized.astype(np.uint8)

#修改字体
plt.rcParams["font.family"] = ["SimHei"]

# 读取图片（替换为实际路径）
image_path = r"C:\Users\29909\Pictures\修狗.jpg"
img = Image.open(image_path).convert('RGB')
img_array = np.array(img)

# 减色为8级（可修改为其他等级，等级越低颜色越简单）
num_levels = 8
quantized_array = color_quantization(img_array, num_levels)

# 显示原图和减色后的图
plt.figure(figsize=(10, 5))
plt.subplot(121)
plt.imshow(img_array)
plt.title('原图')
plt.axis('off')

plt.subplot(122)
plt.imshow(quantized_array)
plt.title(f'减色后（{num_levels}级）')
plt.axis('off')

plt.show()

# 保存结果
quantized_img = Image.fromarray(quantized_array)
quantized_img.save('减色结果.jpg')



            #伽马矫正（五种预设结果）

# 设置中文字体
plt.rcParams["font.family"] = ["SimHei"]

def gamma_correction(image, gamma):
    normalized = image / 255.0
    corrected = np.power(normalized, 1.0 / gamma)
    return (corrected * 255).astype(np.uint8)

# 读取图片（替换为实际路径）
image_path = r"C:\Users\29909\Pictures\修狗.jpg"
img = Image.open(image_path).convert('RGB')
img_array = np.array(img)

# 预设五种伽玛值（涵盖变暗、正常、变亮效果）
gamma_values = [0.3, 0.7, 1.0, 1.5, 3.0]

# 显示原图和五种校正结果
plt.figure(figsize=(15, 8))
plt.subplot(2, 3, 1)
plt.imshow(img_array)
plt.title('原图')
plt.axis('off')

for i, gamma in enumerate(gamma_values, 2):
    corrected = gamma_correction(img_array, gamma)
    plt.subplot(2, 3, i)
    plt.imshow(corrected)
    plt.title(f'γ = {gamma}')
    plt.axis('off')

plt.tight_layout()
plt.show()

# 保存五种结果（可选）
for gamma in gamma_values:
    corrected = gamma_correction(img_array, gamma)
    Image.fromarray(corrected).save(f'伽玛校正_γ={gamma}.jpg')